//Proxy:代理对象 
// es5：
// Object.defineProperty:用于监视对象中的属性，捕获对象的应用属性（vue3.0之前双向绑定的额核心机制）
// es6:
// Proxy:专门用来为对象设置、访问代理器（门卫），监视对象的读写（vue3.0双向绑定）
// https: //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
// proxy=>创建虚拟对象（监听对象，捕捉器）=>捕捉器提供get(目标对象，入参访问属性)的捕获对象函数和set（目标对象，入参访问属性 ，入参设值）的设值函数
// 虚拟对象.属性：捕获目标对象属性
// 虚拟对象.属性=xxx:目标对象设值
const person = {
    name: "sss",
    age: 20
}

const personProxy = new Proxy(person, {
        // 此函数用于获取创建的监听对象、和访问属性
        get(target, property) { //监视属性的访问  get(代理的对象，目标对象访问的属性名)
            console.log(target, property);
            // return 100
            return property in target ? target[property] : 'default'
        },
        // 此函苏可以获取set代理对象、修改属性名、修改的属性值
        set(target, property, value) { //设置监视对象属性   set(代理对象，目标对象的属性名，设置的值)
            if (property === 'age') {
                if (!Number.isInteger(value)) {
                    throw new TypeError(`${value} is not an int`)
                }
            }
            target[property] = value
            return true //表示设值成功
        }
    })
    // 代理对象赋值
personProxy.age = 30
personProxy.gender = true
    // 代理对象捕获
console.log(personProxy.name);
console.log(personProxy.age);
console.log(personProxy);


// 总结：Proxy对象用于创建一个对象的代理，从而实现基本操作的拦截和自定义（如属性查找、赋值、枚举、函数调用等）。